
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "lib_freetype_adapt.h"

#define FONT_FILE "../../resource/font/Droid_Sans_Fallback.ttf"
#define FONT_FILE2 "../../resource/font/ZhanKuXiaoLOGOTi-2.otf"

void drawBitMap(FtBitMap map)
{
    //总字节
    int32_t byteTotal = map.bitHeight * map.lineByte;
    //总字节计数
    int32_t byteTotalCount;
    //一行字节计数
    int32_t lineByteCount;
    //画点用
    uint8_t bit;
    int32_t i;
    //横纵向点计数
    int32_t x = 0, y = 0;

    //纵向起始跳过行数
    for (y = 0; y < map.bitTop; y++)
    {
        for (x = 0; x < map.width; x++)
            printf("-");
        //换行
        printf("\r\n");
    }
    //正文
    for (byteTotalCount = 0; byteTotalCount < byteTotal && y < map.height; y++)
    {
        //横向起始跳过点数
        for (x = 0; x < map.bitLeft; x++)
            printf("-");
        //正文
        for (lineByteCount = 0; lineByteCount < map.lineByte; lineByteCount++, byteTotalCount++)
        {
            //画一行的点(注意 map.lineByte 有盈余,需判断 x < map.width 保证不多画)
            for (i = 0, bit = map.bitMap[byteTotalCount]; i < 8 && x < map.width; i++, x++)
            {
                if (bit & 0x80)
                    printf("#");
                else
                    printf("-");
                bit <<= 1;
            }
        }
        //横向补足点数
        for (; x < map.width; x++)
            printf("-");
        //换行
        printf("\r\n");
    }
    //纵向补足行数
    for (; y < map.height; y++)
    {
        for (x = 0; x < map.width; x++)
            printf("-");
        //换行
        printf("\r\n");
    }
}

void drawGrayMap(FtBitMap map)
{
    //总字节
    int32_t byteTotal = map.bitHeight * map.lineByte;
    //总字节计数
    int32_t byteTotalCount;
    //一行字节计数
    int32_t lineByteCount;
    //画点用
    uint8_t bit;
    //横纵向点计数
    int32_t x = 0, y = 0;

    //纵向起始跳过行数
    for (y = 0; y < map.bitTop; y++)
    {
        for (x = 0; x < map.width; x++)
            printf("-");
        //换行
        printf("\r\n");
    }
    //正文
    for (byteTotalCount = 0; byteTotalCount < byteTotal && y < map.height; y++)
    {
        //横向起始跳过点数
        for (x = 0; x < map.bitLeft; x++)
            printf("-");
        //正文
        for (lineByteCount = 0; lineByteCount < map.lineByte; lineByteCount++, byteTotalCount++, x++)
        {
            bit = map.bitMap[byteTotalCount];
#if 1
            //1~F 表示灰度
            if (bit < 16)
                printf("-");
            else
                printf("%X", bit>>4);
#else
            //1~9 表示灰度
            if (bit < 10)
                printf("-");
            else
                printf("%d", bit/26);
#endif
        }
        //横向补足点数
        for (; x < map.width; x++)
            printf("-");
        //换行
        printf("\r\n");
    }
    //纵向补足行数
    for (; y < map.height; y++)
    {
        for (x = 0; x < map.width; x++)
            printf("-");
        //换行
        printf("\r\n");
    }
}

int32_t main(void)
{
    /* 灰度图:true 位图:false */
    bool isGrayMap = true;
    /* 字号 */
    int32_t fontSize = 32;
    /* 加粗 */
    int32_t fontBold = 0;
    /* 旋转角度: 0~359 */
    int32_t angle = 45;

    FtBitMap map = {0};
    FT_HANDLE handle;
    const char* p;
    int32_t retW = 0;
    int32_t retH = 0;
    char str[] = "1挨副壹\r\n2呐提武";

    /* 初始化 */
    handle = LibFtInit();
    /* 载入字体,一个id对应一个字体 */
    LibFtAddFontFile(handle, FONT_FILE, 0);
    LibFtAddFontFile(handle, FONT_FILE2, 1);

    /* 字符串宽高预测 */
    LibFtGetSizeByUtf8(handle, str, FT_GET_FONT(fontSize, fontBold, 0), 0, 0, 0, angle, &retW, &retH);
    printf("LibFtGetSizeByUtf8: %dx%d \r\n%s\r\n\r\n", retW, retH, str);

    /* 字符串输出测试 */
    p = str;
    while (p && *p)
    {
        /* 逐个字符解析,返回下一个字符地址 */
        p = LibFtGetMapByUtf8(handle, p, FT_GET_FONT(fontSize, fontBold, 1), angle, &map, isGrayMap);
        /* 字符信息 */
        printf("index %d, window %d x %d, bitMap %d x %d, err %d %d, lineByte %d\r\n",
            (int32_t)(p - str),
            map.width,
            map.height,
            map.bitWidth,
            map.bitHeight,
            map.bitLeft,
            map.bitTop,
            map.lineByte);
        /* 检查返回,画图 */
        if (map.bitMap)
        {
            if (isGrayMap)
                drawGrayMap(map);
            else
                drawBitMap(map);
        }
        else
            printf("这是非可见字符: 0x%02X \r\n\r\n", *(p-1));
    }

    /* 特别注意,最后手动释放一次bitMap内存,并置NULL */
    /* 上面连续使用过程中 LibFtGetMapByUtf8 会帮助释放内存*/
    if (map.bitMap)
    {
        free(map.bitMap);
        map.bitMap = NULL;
    }
    LibFtRelease(handle);
    handle = NULL;

    return 0;
}
